"""
饮食类型表 DAO 层（数据访问对象）
负责 food_cate 表的增删改查操作，与数据库直接交互
"""
from app.db import db
from app.Models.HealthModels.FoodModels.FoodCateModel import FoodCate  # 假设模型在 app/models/food_cate.py
from sqlalchemy.exc import IntegrityError, SQLAlchemyError


class FoodCateDAO:
    """饮食类型 DAO 类，封装增删改查方法"""

    @staticmethod
    def add_food_cate(food_cate_name):
        """
        新增饮食类型
        :param food_cate_name: 饮食类型名称（必填，唯一）
        :return: 新增的 FoodCate 实例（含 id）
        :raises: IntegrityError - 名称重复；SQLAlchemyError - 数据库异常
        """
        try:
            # 创建模型实例
            new_cate = FoodCate(food_cate_name=food_cate_name.strip())  # 去除首尾空格
            # 提交到数据库
            db.session.add(new_cate)
            db.session.commit()
            return new_cate
        except IntegrityError as e:
            # 回滚事务（避免事务阻塞）
            db.session.rollback()
            raise IntegrityError(f"饮食类型名称 '{food_cate_name}' 已存在（名称需唯一）", orig=e.orig)
        except SQLAlchemyError as e:
            db.session.rollback()
            raise SQLAlchemyError(f"新增饮食类型失败：{str(e)}")

    @staticmethod
    def get_food_cate_by_id(cate_id):
        """
        根据 ID 查询饮食类型
        :param cate_id: 饮食类型 ID
        :return: FoodCate 实例（不存在则返回 None）
        :raises: SQLAlchemyError - 数据库异常
        """
        try:
            return FoodCate.query.filter_by(id=cate_id).first()
        except SQLAlchemyError as e:
            raise SQLAlchemyError(f"查询饮食类型（ID: {cate_id}）失败：{str(e)}")

    @staticmethod
    def get_food_cate_by_name(food_cate_name):
        """
        根据名称查询饮食类型（精确匹配）
        :param food_cate_name: 饮食类型名称
        :return: FoodCate 实例（不存在则返回 None）
        :raises: SQLAlchemyError - 数据库异常
        """
        try:
            return FoodCate.query.filter_by(food_cate_name=food_cate_name.strip()).first()
        except SQLAlchemyError as e:
            raise SQLAlchemyError(f"查询饮食类型（名称: {food_cate_name}）失败：{str(e)}")

    @staticmethod
    def get_all_food_cates():
        """
        查询所有饮食类型（按 ID 升序排列）
        :return: FoodCate 实例列表
        :raises: SQLAlchemyError - 数据库异常
        """
        try:
            return FoodCate.query.order_by(FoodCate.id.asc()).all()
        except SQLAlchemyError as e:
            raise SQLAlchemyError(f"查询所有饮食类型失败：{str(e)}")

    @staticmethod
    def update_food_cate(cate_id, new_food_cate_name):
        """
        根据 ID 更新饮食类型名称
        :param cate_id: 要更新的饮食类型 ID
        :param new_food_cate_name: 新的饮食类型名称（必填，唯一）
        :return: 更新后的 FoodCate 实例（不存在则返回 None）
        :raises: IntegrityError - 新名称重复；SQLAlchemyError - 数据库异常
        """
        try:
            # 先查询是否存在
            cate = FoodCateDAO.get_food_cate_by_id(cate_id)
            if not cate:
                return None

            # 更新名称（去空格）
            cate.food_cate_name = new_food_cate_name.strip()
            db.session.commit()
            return cate
        except IntegrityError as e:
            db.session.rollback()
            raise IntegrityError(f"更新失败：饮食类型名称 '{new_food_cate_name}' 已存在", orig=e.orig)
        except SQLAlchemyError as e:
            db.session.rollback()
            raise SQLAlchemyError(f"更新饮食类型（ID: {cate_id}）失败：{str(e)}")

    @staticmethod
    def delete_food_cate(cate_id):
        """
        根据 ID 删除饮食类型
        :param cate_id: 要删除的饮食类型 ID
        :return: bool - 删除成功返回 True，不存在返回 False
        :raises: SQLAlchemyError - 数据库异常（如存在外键关联）
        """
        try:
            # 先查询是否存在
            cate = FoodCateDAO.get_food_cate_by_id(cate_id)
            if not cate:
                return False

            # 删除记录
            db.session.delete(cate)
            db.session.commit()
            return True
        except SQLAlchemyError as e:
            db.session.rollback()
            # 若存在外键关联（如 food 表关联 food_cate.id），会抛出异常，需提前处理外键逻辑
            raise SQLAlchemyError(f"删除饮食类型（ID: {cate_id}）失败：{str(e)}")

    @staticmethod
    def get_food_cates_by_keyword(keyword):
        """
        按关键词模糊查询饮食类型（可选扩展方法）
        :param keyword: 搜索关键词（匹配名称）
        :return: FoodCate 实例列表
        :raises: SQLAlchemyError - 数据库异常
        """
        try:
            if not keyword:
                return []
            # 模糊匹配（不区分大小写，前后包含关键词）
            return FoodCate.query.filter(
                FoodCate.food_cate_name.ilike(f"%{keyword.strip()}%")
            ).order_by(FoodCate.id.asc()).all()
        except SQLAlchemyError as e:
            raise SQLAlchemyError(f"模糊查询饮食类型（关键词: {keyword}）失败：{str(e)}")
